VeraCrypt - Бесплатное надёжное шифрование дисков с открытым исходным кодом

Документация Технические подробности Формирование ключа заголовка, соль и количество итераций

# Формирование ключа заголовка, соль и количество итераций

Ключ заголовка используется для шифрования и дешифрования зашифрованной области заголовка тома VeraCrypt (в случае шифрования системы – области ключевых данных), которая содержит мастер-ключ и другую информацию (см. разделы Схема шифрования и Спецификация формата томов VeraCrypt). В томах, созданных с помощью VeraCrypt (и для шифрования системы), эта область зашифрована в режиме XTS (см. раздел Режимы работы). Для генерирования ключа заголовка и вторичного ключа заголовка (режим XTS) VeraCrypt использует метод PBKDF2, определённый в PKCS #5 v2.0; см. [7].
В программе применяется 512-битовая соль, что означает 2512 ключей для каждого пароля. Благодаря этому значительно повышается устойчивость к атакам с офлайн-словарями/"радужной таблицей" (соль крайне осложняет предвычисление всех ключей для словаря паролей) [7]. Соль состоит из случайных значений, созданных генератором случайных чисел VeraCrypt в процессе создания тома. Функция формирования (деривации) ключа заголовка основана на HMAC-SHA-512, HMAC-SHA-256, HMAC-BLAKE2S-256, HMAC-Whirlpool или HMAC-Streebog (см. [8, 9, 20, 22]) – какая из них будет применяться, выбирается пользователем. Длина сформированного ключа не зависит от размера вывода лежащей в основе хеш-функции. Например, длина ключа заголовка для шифра AES-256 всегда равна 256 битам, даже если используется HMAC-SHA-512 (в режиме XTS применяется дополнительный 256-битовый вторичный ключ заголовка; следовательно, для AES-256 в целом применяются два 256-битовых ключа). Более подробную информацию см. в [7]. Для формирования ключа заголовка выполняется большое количество итераций, что увеличивает время, необходимое для полного поиска паролей (то есть атакой методом перебора) [7].

До версии 1.12 в VeraCrypt всегда использовалось фиксированное количество итераций, зависящее только от типа тома и алгоритма формирования ключа.

Начиная с версии 1.12, поле PIM (Персональный множитель итераций) даёт пользователям больший контроль за количеством итераций, используемых в функции формирования ключа.

Если PIM не указан или равен нулю, VeraCrypt использует следующие стандартные значения:

- Для шифрования системы (шифрование загрузки), если используется SHA-256, BLAKE2s-256 или Streebog, число итераций = 200 000.
- Для шифрования системы, если используется SHA-512 или Whirlpool, а также для несистемных разделов и файловых контейнеров число итераций = 500 000.

Если PIM указан, то количество итераций функции формирования ключа вычисляется следующим образом:

- Для шифрования системы, если не используется SHA-512 или Whirlpool, число итераций = PIM × 2048.
- Для шифрования системы, если используется SHA-512 или Whirlpool, а также для несистемных разделов и файлов-контейнеров число итераций = 15 000 + (PIM × 1000).

Ключи заголовка, используемые шифрами при каскадном (последовательном) шифровании, не зависят друг от друга, хотя они и сформированы из одного пароля (к которому могут быть применены ключевые файлы). Например, для каскада AES-Twofish-Serpent функция формирования ключа заголовка получает 768-битный ключ шифрования из заданного пароля (и, для режима XTS, вдобавок 768-битовый вторичный ключ заголовка из заданного пароля). Сгенерированный 768-битовый ключ заголовка затем разделяется на три 256-битовых ключа (для режима XTS вторичный ключ разделяется тоже на три 256-битовых ключа, поэтому в действительности каскад в целом использует шесть 256-битовых ключей), из которых первый ключ используется шифром Serpent, второй – шифром Twofish, а третьй – шифром AES (кроме того, для режима XTS первый вторичный ключ используется шифром Serpent, второй вторичный ключ – шифром Twofish, и третий вторичный ключ – шифром AES). Отсюда следует, что даже если у неприятеля окажется один из ключей, он не сможет им воспользоваться для формирования остальных, поскольку не существует реально осуществимого способа определить пароль по полученному из него в результате формирования ключу (за исключением атаки полным перебором при слабом пароле).
Следующий раздел >>